package uy.org.softtech.cssuite.repositorios.impl;

import static org.hibernate.criterion.Order.desc;
import static org.hibernate.criterion.Restrictions.eq;
import static org.springframework.util.Assert.notNull;

import java.util.HashSet;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import uy.org.softtech.cssuite.entidad.finanzas.Pago;
import uy.org.softtech.cssuite.repositorios.RepositorioPagos;

/**
 * Clase que implementa {@link RepositorioPagos}.
 * 
 * @author fabian.lobo
 * @see RepositorioPagos
 */
@Repository(value = "repositorio-pagos")
public class RepositorioPagosImpl extends HibernateDaoSupport implements RepositorioPagos {

	private Logger log = Logger.getLogger(getClass());
	
	@Required
	@Resource(name = "fabrica-sesiones")
	public void fabricaSesiones(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void inicializacion(){
		notNull(getSessionFactory(), "La propiedad [sessionFactory] de [" + getClass().getName() + "] no ha sido establecida.");
		
		log.info("Implementación de los accesos a datos relacionados con los pagos ha sido inicializado.");
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public Set<Pago> obtenerPagos(Long cuenta) {
		Set<Pago> pagos = new HashSet<Pago>();
		try {
			Criteria criteria = getSession().createCriteria(Pago.class);
			criteria.createAlias("cuenta", "cuenta");
			criteria.add(eq("cuenta.id", cuenta));
			criteria.addOrder(desc("id"));
			pagos.addAll(criteria.list());
		} catch (Throwable t) {
			log.error(t);
		}		
		return pagos;
	}

}
